﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Entidad;


public partial class ClienteABMC : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack) //Solo la primera vez carga la grilla
        {          
            Nuevo();           
            cargarLocalidades();
            cargarSexos();
            cargarTiposDocumentos();
            int id_cliente = 0;
            if (int.TryParse(Request["id_cliente"], out id_cliente))
            {
                editarCliente(id_cliente);
            }
            ////con sesion bug, al entrar puede existir el id desde otra sesion y no carga en blanco sino q rellena.
            //if (Session["id_cd"] != null && int.TryParse(Session["id_cd"].ToString(), out id_cd))
            //{
            //    editarCD(id_cd);
            //}

            if (Context.User.IsInRole("administrador"))
            {
                btnNuevo.Visible = true;
                btnEliminar.Visible = true;
                lblBuscar.Visible = true;
                txtBuscar.Visible = true;    
                btnBuscar.Visible = true;     
                gvCliente.Visible = true;

                CargarGrilla();

            }
            else
            {
                if (Context.User.IsInRole("usuario"))
                {
                    btnNuevo.Visible = true;
                    btnEliminar.Visible = false;
                    lblBuscar.Visible = false;
                    txtBuscar.Visible = false;
                    btnBuscar.Visible = false;
                    gvCliente.Visible = true;

                    CargarGrillaSoloUsuario();
                }
                else
                {
                    btnNuevo.Visible = true;
                    btnEliminar.Visible = false;
                    lblBuscar.Visible = false;
                    txtBuscar.Visible = false;
                    btnBuscar.Visible = false;

                    gvCliente.Visible = false;

                }
            }
        
        }
    }

    private void editarCliente(int clienteId)
    {
        EntidadCliente cliente = DAO.DAOCliente.Buscar(clienteId);
        Nuevo();
        if (cliente != null)
        {
            txtNombre.Text = cliente.nombre;
            txtApellido.Text = cliente.apellido;
            txtFechaNac.Text = cliente.fecha_nacimiento.Value.ToShortDateString();
            cboTipoDoc.SelectedValue = cliente.id_tipo_documento.ToString();
            txtNroDoc.Text = cliente.numero_documento.ToString();

            string nombreUsuario = DAO.DAOUsuario.getNombreUsuario(int.Parse(cliente.id_usuario.ToString()));
            EntidadUsuario usuario = DAO.DAOUsuario.getUsuario(nombreUsuario);
            txtUsuario.Text = usuario.usuario;
            txtPassword.Text = usuario.clave;

            cboSexo.SelectedValue = cliente.id_sexo.ToString();
            txtCalle.Text = cliente.calle;
            txtNumero.Text = cliente.numero.ToString();

            int id_localidad = DAO.DAOBarrio.getIdLocalidad(int.Parse(cliente.id_barrio.ToString()));
            cboLocalidad.SelectedValue = id_localidad.ToString();

            cboBarrio.DataSource = DAO.DAOBarrio.barriosPorLocalidad(id_localidad);
            cboBarrio.DataTextField = "nombre";
            cboBarrio.DataValueField = "id_barrio";
            cboBarrio.DataBind();
            cboBarrio.Items.Insert(0, new ListItem("(Sin Seleccion)", ""));

            cboBarrio.SelectedValue = cliente.id_barrio.ToString();
            txtEmail.Text = cliente.email;
            if (cliente.telefono.HasValue)
            {
                txtTelefono.Text = cliente.telefono.ToString();
            }

            if (cliente.salario.HasValue)
            {
                txtSalario.Text = cliente.salario.ToString();
            }

            ViewState["id_cliente"] = cliente.id_cliente;
            btnEliminar.Enabled = true;
        }
    }
    private void cargarSexos()
    {
        cboSexo.DataSource = DAO.DAOSexo.getTodas();
        cboSexo.DataTextField = "nombre";
        cboSexo.DataValueField = "id_sexo";
        cboSexo.DataBind();
        cboSexo.Items.Insert(0, new ListItem("(Sin Seleccion)", ""));
        cboSexo.SelectedIndex = 0;
        
    }

    private void cargarTiposDocumentos()
    {
        cboTipoDoc.DataSource = DAO.DAOTipoDocumento.getTodas();
        cboTipoDoc.DataTextField = "nombre";
        cboTipoDoc.DataValueField = "id_tipo_documento";
        cboTipoDoc.DataBind();
        cboTipoDoc.Items.Insert(0, new ListItem("(Sin Seleccion)", ""));

        cboTipoDoc.SelectedIndex = 0;
    }

    private void cargarLocalidades()
    {
        cboLocalidad.DataSource = DAO.DAOLocalidad.getTodas();
        cboLocalidad.DataTextField = "nombre";
        cboLocalidad.DataValueField = "id_localidad";
        cboLocalidad.DataBind();

        cboLocalidad.Items.Insert(0, new ListItem("(Sin Seleccion)", ""));
        cboLocalidad.SelectedIndex = 0;
        cboBarrio.Items.Insert(0, new ListItem("(Sin Seleccion)", ""));
        cboBarrio.SelectedIndex = 0;
    }

    protected void cboLocalidad_SelectedIndexChanged(object sender, EventArgs e)
    {
        int id_localidad = cboLocalidad.SelectedIndex;
        cboBarrio.DataSource = DAO.DAOBarrio.barriosPorLocalidad(id_localidad);
        cboBarrio.DataTextField = "nombre";
        cboBarrio.DataValueField = "id_barrio";
        cboBarrio.DataBind();
        cboBarrio.Items.Insert(0, new ListItem("(Sin Seleccion)", ""));
        cboBarrio.SelectedIndex = 0;
    }

    private void CargarGrilla()
    {
        gvCliente.DataSource = DAO.DAOCliente.getTodas();
        gvCliente.DataKeyNames = new string[] { "id_cliente" };
        gvCliente.DataBind();
    }

    private void CargarGrillaSoloUsuario()
    {
        int id_usuario = DAO.DAOUsuario.getIdUsuario(Context.User.Identity.Name);      
        gvCliente.DataSource = DAO.DAOCliente.BuscarPorUsuario(id_usuario);
        gvCliente.DataKeyNames = new string[] { "id_cliente" };
        gvCliente.DataBind();
    }

    protected void btnNuevo_Click(object sender, EventArgs e)
    {
        Nuevo();
    }

    private void Nuevo()
    {
        cboTipoDoc.ClearSelection();
        cboTipoDoc.SelectedIndex = -1;
        cboBarrio.ClearSelection();
        cboBarrio.SelectedIndex = -1;
        cboSexo.ClearSelection();
        cboSexo.SelectedIndex = -1;
        txtNombre.Text = string.Empty;
        txtApellido.Text = string.Empty;
        txtFechaNac.Text = string.Empty;
        txtNroDoc.Text = string.Empty;
        txtCalle.Text = string.Empty;
        txtNumero.Text = string.Empty;
        txtEmail.Text = string.Empty;
        txtTelefono.Text = string.Empty;
        txtSalario.Text = string.Empty;
        txtUsuario.Text = string.Empty;
        txtPassword.Text = string.Empty;
        alertaCliente.Visible = false;
        alertaNumeroDoc.Visible = false;
        alertaEmail.Visible = false;
        alertaUsuario.Visible = false;
        


        btnEliminar.Enabled = false;
        ViewState["id_cliente"] = null;
    }
    protected void btnAceptar_Click(object sender, EventArgs e)
    {
        alertaEmail.Visible = false;
        alertaNumeroDoc.Visible = false;
        alertaUsuario.Visible = false;

        if (ViewState["id_cliente"] == null)
        {
            //es un alta
            long numero_documento = long.Parse(txtNroDoc.Text);
            string nombre_usuario = txtUsuario.Text;
            string email = txtEmail.Text;
            if (!DAO.DAOCliente.numeroDocumentoEnUso(numero_documento) && !DAO.DAOUsuario.usuarioEnUso(nombre_usuario)
                && !DAO.DAOCliente.emailEnUso(email))
            {
                EntidadCliente cliente = new EntidadCliente();
                EntidadUsuario usuario = new EntidadUsuario();
                usuario.usuario = txtUsuario.Text;
                usuario.clave = txtPassword.Text;
                usuario.id_rol = 1;
                DAO.DAOUsuario.Guardar(usuario);
                int id_usuario = DAO.DAOUsuario.getIdUsuario(nombre_usuario);

                cliente.nombre = txtNombre.Text;
                cliente.apellido = txtApellido.Text;
                cliente.fecha_nacimiento = DateTime.Parse(txtFechaNac.Text);
                cliente.numero_documento = long.Parse(txtNroDoc.Text);
                cliente.id_usuario = id_usuario;
                cliente.calle = txtCalle.Text;
                cliente.numero = int.Parse(txtNumero.Text);
                cliente.email = txtEmail.Text;

                if (!string.IsNullOrEmpty(txtTelefono.Text))
                {
                    cliente.telefono = Int64.Parse(txtTelefono.Text);
                }

                if (!string.IsNullOrEmpty(txtSalario.Text))
                {
                    cliente.salario = float.Parse(txtSalario.Text);
                }

                if (cboTipoDoc.SelectedIndex > 0)
                {
                    cliente.id_tipo_documento = int.Parse(cboTipoDoc.SelectedValue);
                }


                if (cboSexo.SelectedIndex > 0)
                {
                    cliente.id_sexo = int.Parse(cboSexo.SelectedValue);
                }

                if (cboBarrio.SelectedIndex > 0)
                {
                    cliente.id_barrio = int.Parse(cboBarrio.SelectedValue);
                }
                DAO.DAOCliente.Guardar(cliente);
                CargarGrilla();
                Nuevo();
            }
            else
            {
                if (DAO.DAOCliente.numeroDocumentoEnUso(numero_documento))
                    alertaNumeroDoc.Visible = true;

                if (DAO.DAOUsuario.usuarioEnUso(nombre_usuario))
                    alertaUsuario.Visible = true;

                if (DAO.DAOCliente.emailEnUso(email))
                    alertaEmail.Visible = true;

            }

        }
        else
        {
            //estoy modificando..
            long numero_documento = long.Parse(txtNroDoc.Text);
            string nombre_usuario = txtUsuario.Text;
            int clienteId = int.Parse(ViewState["id_cliente"].ToString());
            EntidadCliente cliente = DAO.DAOCliente.Buscar(clienteId);
            int usuarioId = int.Parse(cliente.id_usuario.ToString());

            if ((cliente.numero_documento == numero_documento || !DAO.DAOCliente.numeroDocumentoEnUso(numero_documento))
                && ((DAO.DAOUsuario.getNombreUsuario(usuarioId) == nombre_usuario || !DAO.DAOUsuario.usuarioEnUso(nombre_usuario)))
                && (cliente.email == txtEmail.Text || !DAO.DAOCliente.emailEnUso(txtEmail.Text)))
            {

                EntidadUsuario usuario = new EntidadUsuario();
                usuario.id_usuario = usuarioId;
                usuario.usuario = txtUsuario.Text;
                usuario.clave = txtPassword.Text;
                usuario.id_rol = 1;
                DAO.DAOUsuario.Actualizar(usuario);



                cliente.nombre = txtNombre.Text;
                cliente.apellido = txtApellido.Text;
                cliente.fecha_nacimiento = DateTime.Parse(txtFechaNac.Text);
                cliente.numero_documento = Int64.Parse(txtNroDoc.Text);
                cliente.id_usuario = usuarioId;
                cliente.calle = txtCalle.Text;
                cliente.numero = int.Parse(txtNumero.Text);
                cliente.email = txtEmail.Text;

                if (!string.IsNullOrEmpty(txtTelefono.Text))
                {
                    cliente.telefono = Int64.Parse(txtTelefono.Text);
                }

                if (!string.IsNullOrEmpty(txtSalario.Text))
                {
                    cliente.salario = Int32.Parse(txtSalario.Text);
                }

                if (cboTipoDoc.SelectedIndex > 0)
                {
                    cliente.id_tipo_documento = int.Parse(cboTipoDoc.SelectedValue);
                }
                else
                {
                    cliente.id_tipo_documento = null;
                }


                if (cboSexo.SelectedIndex > 0)
                {
                    cliente.id_sexo = int.Parse(cboSexo.SelectedValue);
                }
                else
                {
                    cliente.id_sexo = null;
                }

                if (cboBarrio.SelectedIndex > 0)
                {
                    cliente.id_barrio = int.Parse(cboBarrio.SelectedValue);
                }
                else
                {
                    cliente.id_barrio = null;
                }

                DAO.DAOCliente.Actualizar(cliente);

                if (User.IsInRole("usuario"))
                {
                    CargarGrillaSoloUsuario();
                }
                else
                {
                    CargarGrilla();
                }
                
                Nuevo();
            }
            else
            {
                if (cliente.numero_documento != numero_documento && DAO.DAOCliente.numeroDocumentoEnUso(numero_documento))
                    alertaNumeroDoc.Visible = true;

                if (DAO.DAOUsuario.getNombreUsuario(usuarioId) != nombre_usuario && DAO.DAOUsuario.usuarioEnUso(nombre_usuario))
                    alertaUsuario.Visible = true;

                if (cliente.email != txtEmail.Text && DAO.DAOCliente.emailEnUso(txtEmail.Text))
                    alertaEmail.Visible = true;
            }

        }
    }

    protected void gvCliente_SelectedIndexChanged(object sender, EventArgs e)
    {
        int clienteId = (int)gvCliente.SelectedDataKey.Value;
        editarCliente(clienteId);
    }

    protected void btnEliminar_Click(object sender, EventArgs e)
    {
        if (ViewState["id_cliente"] != null)
        {
            int id_cliente = int.Parse(ViewState["id_cliente"].ToString());
            if (DAO.DAOFactura.ClienteEnUso(id_cliente))
            {
                alertaCliente.Visible = true;
            }

            else
            {

                Entidad.EntidadCliente cliente = new EntidadCliente();
                int clienteId = int.Parse(ViewState["id_cliente"].ToString());
                cliente = DAO.DAOCliente.Buscar(clienteId);
                int UsuarioId = cliente.id_usuario.Value; 
                DAO.DAOCliente.Eliminar(cliente);
                DAO.DAOUsuario.Eliminar(UsuarioId);
                Nuevo();
                CargarGrilla();

            }

        }
    }

    protected void btnBuscar_Click(object sender, EventArgs e)
    {
        gvCliente.DataSource = DAO.DAOCliente.BuscarPorApellido(txtBuscar.Text);
        gvCliente.DataKeyNames = new string[] { "id_cliente" };
        gvCliente.DataBind();
    }
}